#pragma once

#include <compl.h>

#define PROMPT_FUNC				NORETURN
#define PROMPT_STK_RESERVED_SIZE		(0)

#define PROMPT_RETURN_RV			(0)
#define PROMPT_RETURN_YIELD			(1)

/* 启用 PROMPT在栈上分配上下文(可能开销比较大) */
// #define PROMPT_STKBUF

#ifndef PROMPT_STKBUF
	#define PROMPT_CTXBUF			presume_t res
	#define PROMPT_GET_CTXBUF(p, pbuf)	pbuf = (&((p)->res))
	#define PROMPT_SET_RETURN(p, ret)	(void)ret			   /* 不需要执行任何操作 */
	#define PROMPT_GET_RETURN(p)		(&((p)->parent->res))
#else
	#define PROMPT_CTXBUF			preturn_t *pret
	#define PROMPT_GET_CTXBUF(p, pbuf)	presume_t __res__; pbuf = &__res__
	#define PROMPT_GET_RETURN(p)		((p)->pret)
	#define PROMPT_SET_RETURN(p, ret)	(p)->pret = ret
#endif

/* 预取presume_t大小, 编译器将循环UNROLL, 一般情况下不需要预取	*/
#ifdef PROMPT_PREFETCH_ENABLE
	#define PROMPT_PREFETCH(p)		\
	for(size_t offst = 0; offst < sizeof(presume_t); offst += HDEF_CACHE_LINE_BYTES) { PREFETCH((word_t *)((paddr_t)(p) + offst));}
#else
	#define PROMPT_PREFETCH(p)		
#endif
